package com.bj;


import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class MathUtil {
	public static int randomNum(int max) {
		return (int) (Math.random() * max);
	}
	
	public static BigDecimal Cfunction(int n,int k){
		BigDecimal allCombinationNum=new BigDecimal(1);
		BigDecimal selectCombinationNum=new BigDecimal(1);
		BigDecimal x=new BigDecimal(n);
		BigDecimal y=new BigDecimal(k);
		
		for(int i=0;i<k;i++){
			allCombinationNum=allCombinationNum.multiply(x);
			x=x.subtract(new BigDecimal(1));
		}
		for(int i=0;i<k;i++){
			selectCombinationNum=selectCombinationNum.multiply(y);
			y=y.subtract(new BigDecimal(1));
		}
		
		return allCombinationNum.divide(selectCombinationNum);
	}
	
	public static double sq(double a,int k){
		double sq=1;
		for(int i=0;i<k;i++){
			sq=sq*a;
		}
		return sq;
	}
	
	public static BigDecimal winPercentInKNP(double p,int k,int n){
		BigDecimal winP=new BigDecimal(0);
		for(int i=k;i<=n;i++){
			winP=winP.add(Cfunction(n,i).multiply(new BigDecimal(sq(p,i)*sq(1-p,(n-i)))));
		}
		return winP.multiply(new BigDecimal(1));
	}
	
	
	public static void main(String[] args){
//		System.out.println(Cfunction(1000,500).multiply(new BigDecimal(sq(0.5,500)*sq(0.5,500))).doubleValue());
		System.out.println(winPercentInKNP(0.5033,1400,3000));
//		System.out.println(Cfunction(1000,500).multiply(new BigDecimal(sq(0.498,500)*sq(0.502,500))).doubleValue());
//		System.out.println(winPercentInKNP(0.024678250170521807,1,50).doubleValue());
		
		
	}


	public static List Cfunction(Object[] a, int m) {
		int n = a.length;

		List result = new ArrayList();

		int[] bs = new int[n];
		for (int i = 0; i < n; i++) {
			bs[i] = 0;
		}
		// ��ʼ��
		for (int i = 0; i < m; i++) {
			bs[i] = 1;
		}
		boolean flag = true;
		boolean tempFlag = false;
		int pos = 0;
		int sum = 0;
		// �����ҵ���һ��10��ϣ�Ȼ����01��ͬʱ��������е�1�ƶ�������������
		do {
			sum = 0;
			pos = 0;
			tempFlag = true;
			result.add(print(bs, a, m));

			for (int i = 0; i < n - 1; i++) {
				if (bs[i] == 1 && bs[i + 1] == 0) {
					bs[i] = 0;
					bs[i + 1] = 1;
					pos = i;
					break;
				}
			}
			// ����ߵ�1ȫ���ƶ�������������

			for (int i = 0; i < pos; i++) {
				if (bs[i] == 1) {
					sum++;
				}
			}
			for (int i = 0; i < pos; i++) {
				if (i < sum) {
					bs[i] = 1;
				} else {
					bs[i] = 0;
				}
			}

			// ����Ƿ����е�1���ƶ��������ұ�
			for (int i = n - m; i < n; i++) {
				if (bs[i] == 0) {
					tempFlag = false;
					break;
				}
			}
			if (tempFlag == false) {
				flag = true;
			} else {
				flag = false;
			}

		} while (flag);
		result.add(print(bs, a, m));

		return result;
	}

	private static Object[] print(int[] bs, Object[] a, int m) {
		Object[] result = new Object[m];
		int pos = 0;
		for (int i = 0; i < bs.length; i++) {
			if (bs[i] == 1) {
				result[pos] = a[i];
				pos++;
			}
		}
		return result;
	}
}
